package negocio;

import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

@Entity
@Table(name="LVTP_LISTAS_PRECIOS")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="DISCRIMINADOR", discriminatorType=DiscriminatorType.STRING)
@org.hibernate.annotations.ForceDiscriminator
public abstract class ListaDePrecios
{
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column (name="ID_LISTA_PRECIO")
	private Integer codigo;
	
	@Column (name="NUMERO", length=20)
	private String numero;
	
	@Column (name="FECHA_INICIO")
	private Date fechaInicio;
	
	@Column (name="FECHA_FIN")
	private Date fechaFin;
	
	@Column (name="TIPO_LISTA", length=20)
	private String tipoDeLista;
	
	@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
	@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@LazyCollection(LazyCollectionOption.FALSE)
	@JoinColumn(name="ID_LISTA_PRECIO")
	private Set<ListaDePreciosItem> items;

	public ListaDePrecios()
	{
		items = new HashSet<ListaDePreciosItem>();
	}

	public Integer getCodigo() {
		return codigo;
	}

	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public Date getFechaInicio() {
		return fechaInicio;
	}

	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	public Date getFechaFin() {
		return fechaFin;
	}

	public void setFechaFin(Date fechaFin) {
		this.fechaFin = fechaFin;
	}

	public String getTipoDeLista() {
		return tipoDeLista;
	}

	public void setTipoDeLista(String tipoDeLista) {
		this.tipoDeLista = tipoDeLista;
	}

	public Set<ListaDePreciosItem> getItems() {
		return items;
	}

	public void setItems(Set<ListaDePreciosItem> items) {
		this.items = items;
	}
	
	public String toString()
	{
		return String.format("{0} - {1}", codigo, numero);
	}
	
	public boolean equals(Object obj)
	{
		if (obj != null && this.getClass().isInstance(obj)){
			ListaDePrecios tmp = (ListaDePrecios)obj;
			return codigo.equals(tmp.getCodigo());
		}
		return false;
	}
	
	
	public ListaDePreciosItem obtenerItem(Producto producto){
		Iterator<ListaDePreciosItem> i = items.iterator();
		while(i.hasNext())
		{
			ListaDePreciosItem item = i.next();
			if (item.getProducto().equals(producto))
				return item;
		}
		return null;
	}
	
	public void actualizarProducto(Producto producto, Integer stock, Double precio){
		ListaDePreciosItem item = obtenerItem(producto);
		// Para que se pueda actualizar el stock y el precio deben ser mayor a 0.
		if (stock > 0 && precio > Double.parseDouble("0")){
			if (item==null){
				item = new ListaDePreciosItem();
				item.setProducto(producto);
				items.add(item);
			}
			item.setStock(stock);
			item.setPrecio(precio);
		}else{
			if (item!=null){
				items.remove(item);
			}
		}
	}
	
	public boolean estaVigente(){
		Date hoy = new Date();
		return (fechaInicio.before(hoy) && (fechaFin==null || fechaFin.after(hoy)));
	}
	
	public boolean esListaDeProveedor(){
		return false;
	}
}
